Qt QGraphicsScene绘图节点保存及恢复

您所在的位置:网站首页 qt boundingrect Qt QGraphicsScene绘图节点保存及恢复

Qt QGraphicsScene绘图节点保存及恢复

2023-04-08 13:00| 来源: 网络整理| 查看: 265

在上一篇文章中 Qt 遍历不规则树的节点,介绍了节点保存及恢复,但是恢复时不是将原有节点原样恢复。这里介绍怎样恢复原样。

思路:要恢复恢复,首先肯定要有节点的坐标(在scene中)。节点恢复后,还要使用箭头连接。据此,我们保存时,要保存节点坐标,及箭头首尾节点。根据上一篇文章,我们在创建时已经给节点了唯一标识。

唯一标识代码:

QString getGUID() { QUuid id = QUuid::createUuid(); QString strId = id.toString(); return strId; }

保存函数及说明如下:

bool OperateItemFile::SaveItemArrowFile(QList &pItemList, QList &pArrowList, QString itFilePath) { if(pItemList.size() > 0){ QDomDocument doc; doc.appendChild( doc.createProcessingInstruction("xml", XML_HEAD_INFO)); QFile file(itFilePath); if (!file.open(QIODevice::WriteOnly)){ return false; } QDomElement root = doc.createElement("Root"); doc.appendChild(root); //设备节点 QDomElement dev = doc.createElement("DeviceVerb"); root.appendChild(dev); for(int i=0 ;igetItemId()); ItemE.setAttribute("left" ,pItemList.at(i)->boundingRect().left()); ItemE.setAttribute("top" ,pItemList.at(i)->boundingRect().top()); ItemE.setAttribute("right" ,pItemList.at(i)->boundingRect().right()); ItemE.setAttribute("bottom" ,pItemList.at(i)->boundingRect().bottom()); ItemE.setAttribute("name" ,pItemList.at(i)->getText()); ItemE.setAttribute("x" ,pItemList.at(i)->pos().x()); ItemE.setAttribute("y" ,pItemList.at(i)->pos().y()); ItemE.setAttribute("z" ,pItemList.at(i)->zValue()); ItemE.setAttribute("color" ,pItemList.at(i)->brush().color().rgb()); ItemE.setAttribute("brushstyle" ,pItemList.at(i)->brush().style()); ItemE.setAttribute("type" ,pItemList.at(i)->diagramType()); getItemChild(pItemList, pItemList.at(i), doc, ItemE); dev.appendChild(ItemE); } //保存箭头 if(pArrowList.size() > 0){ QDomElement arrow = doc.createElement("ArrowVerb"); root.appendChild(arrow); for(int i=0 ;igetStartId()); ArrowItem.setAttribute("EndItemId" ,pArrowList.at(i)->getEndId()); arrow.appendChild(ArrowItem); } } QString xml = doc.toString(); QTextStream txtOutput(&file); txtOutput.setCodec("UTF-8"); txtOutputsetZValue(z.toFloat()); pItem->setBkColor(QColor(rgb.toUInt())); pItem->setItemId(id); pItem->setText(name); pItem->setBrush(QBrush(rgb.toUInt(), (Qt::BrushStyle)brushstyle.toUInt())); if(itemType.compare("Port") == 0) { QString parentItemId = fileElem.attribute("parentItemId"); pItem->setParentItemId(parentItemId); } szAttrVal.push_back(name); szAttrVal.push_back(rgb); szAttrVal.push_back("False"); szAttrVal.push_back(""); szAttrVal.push_back(""); szAttrVal.push_back(""); szAttrVal.push_back(""); for (int j = 0; j < szAttrName.size(); j++) { pItem->setItemAttr(j, szAttrName.at(j), szAttrVal.at(j)); } pList->push_back(pItem); } return true; } bool OperateItemFile::GetItemArrowFromFile(QString strItemPath, QList *pItemList, QList *pArrowList, QMenu *itemMenu){ if(strItemPath.length() setItemId(sid,eid); pArrowList->push_back(pItem); } file.close(); return true; } bool OperateItemFile::loadItemToScene(DiagramScene* pScene, bool bIsDialog, QString srcPath){ if(!pScene) return false; QList itemList; QList ArrowList; QString strName; if(bIsDialog) strName = QFileDialog::getOpenFileName(nullptr, QObject::tr("open xml file"), p_globalObject->ProjectPath() + "/" + p_globalObject->getProjectName() ,QObject::tr("XML文件(*XML*)")); else strName = srcPath; //////////////////////////////////////////////////////////////////////////////////// if(!GetItemArrowFromFile(srcPath, &itemList, &ArrowList, NULL)) return false; pScene->ItemClear(); int i=0; for(i=0 ;isetBrush(pScene->itemColor()); pScene->addItem(itemList.at(i)); } pScene->setMode(DiagramScene::Mode::MoveItem); //设置箭头起始节点 int j=0; for(i=0 ;igetItemId()){ ArrowList.at(i)->setStartItem(itemList.at(j)); break; } } } //设置箭头结尾节点 for(i=0 ;igetItemId()){ ArrowList.at(i)->setEndItem(itemList.at(j)); break; } } } for(i=0 ;istartItem()!=NULL) ArrowList.at(i)->startItem()->addArrow(ArrowList.at(i)); if(ArrowList.at(i)->endItem()!=NULL) ArrowList.at(i)->endItem()->addArrow(ArrowList.at(i)); ArrowList.at(i)->setColor(pScene->lineColor()); ArrowList.at(i)->setZValue(-1000.0); pScene->addItem(ArrowList.at(i)); if(p_globalObject->getCurStatus() == QGlobalObject::devStatus) ArrowList.at(i)->setArrowFlag(true); else ArrowList.at(i)->setArrowFlag(true); ArrowList.at(i)->updatePosition(); } return true; }

  

getNormalItem函数中的type,区分是不是子节点。loadItemToScene 的参数bIsDialog,来确定是否显示文件对话框。

 

Qt 遍历不规则树的节点


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3